import sys
import os
sys.path.insert(0, os.path.abspath('../'))
sys.path.insert(0, os.path.abspath('../../'))
import optuna
from qiskit.utils import QuantumInstance
from qiskit_optimization.algorithms import MinimumEigenOptimizer
from qiskit.algorithms import QAOA
from shared.graph_helper import *
from shared.QiskitMaxcut import *
from ionq.ionq_parameters import *
%matplotlib inline
# ---- Define graph and MaxCut ----
graph = generate_butterfly_graph(with_weights=True)
#graph = load_nx_graph_from("../data/graphs/04_nodes/graph_04_04_03_w.txt")
max_cut = Maxcut(graph)
max_cut_qubo = max_cut.to_qubo()
max_cut.draw()
def init_qaoa(optimizer, reps, init_parameters):
quantum_instance = QuantumInstance(
backend=simulator_backend,
shots=SHOTS)
qaoa = QAOA(optimizer=optimizer, quantum_instance=quantum_instance, reps=reps,
initial_point=init_parameters)
return qaoa
def run(max_cut_problem, qaoa):
# Run quantum algorithm QAOA
algorithm = MinimumEigenOptimizer(qaoa)
result = algorithm.solve(max_cut_problem)
optimal_parameters = qaoa.optimal_params
return result, optimal_parameters.copy()
def objective(trial):
optimizer_name = trial.suggest_categorical("optimizer", optimizers.keys())
reps = trial.suggest_int('reps', REPS_MIN, REPS_MAX + 1)
parameters = []
for i in range(reps):
parameters.append(trial.suggest_uniform(f'gamma_{i}', GAMMA_MIN, GAMMA_MAX))
for i in range(reps):
parameters.append(trial.suggest_uniform(f'beta_{i}', BETA_MIN, BETA_MAX))
optimizer = optimizers[optimizer_name]
qaoa = init_qaoa(optimizer, reps, parameters)
result, optimal_parameters = run(max_cut_qubo, qaoa)
mean, distribution = max_cut.analyse(result)
trial.set_user_attr(key="best", value=[mean,result,optimal_parameters])
return mean
study = optuna.create_study(direction='minimize')
study.optimize(objective, n_trials=N_TRIALS, callbacks=[save_best_trial])
[I 2021-07-28 18:33:21,612] A new study created in memory with name: no-name-93479ed0-14ec-431d-88eb-7689ca03de07 [I 2021-07-28 18:39:56,259] Trial 0 finished with value: -22.565000000000005 and parameters: {'optimizer': 'SPSA', 'reps': 7, 'gamma_0': 2.338733458715179, 'gamma_1': 2.3861550268345173, 'gamma_2': -2.5588157817633337, 'gamma_3': -1.6152559685418775, 'gamma_4': -2.9405847771690716, 'gamma_5': -2.8628107850588282, 'gamma_6': 0.9608182850461935, 'beta_0': 0.018219493628407246, 'beta_1': 0.7188340729214175, 'beta_2': -1.671715832360576, 'beta_3': 2.580161775117153, 'beta_4': 1.5678990079991353, 'beta_5': 0.8610033308261977, 'beta_6': 0.3304368444497605}. Best is trial 0 with value: -22.565000000000005. [I 2021-07-28 18:46:31,891] Trial 1 finished with value: -22.070999999999998 and parameters: {'optimizer': 'SPSA', 'reps': 9, 'gamma_0': -0.9702827524983277, 'gamma_1': -0.14315284478057677, 'gamma_2': -2.397353271293947, 'gamma_3': 2.073755386573395, 'gamma_4': -0.8963508839442915, 'gamma_5': 2.4343324947546305, 'gamma_6': 0.8933544568298224, 'gamma_7': 1.4333877393817582, 'gamma_8': -1.3271553111512846, 'beta_0': 2.357977237983496, 'beta_1': 1.2476757056107415, 'beta_2': 1.0905397523018294, 'beta_3': 3.1359451195386514, 'beta_4': 2.588596833182484, 'beta_5': -1.2952272239179161, 'beta_6': -0.5480170739989507, 'beta_7': 1.7400699662396466, 'beta_8': -1.0923593990819302}. Best is trial 0 with value: -22.565000000000005. [I 2021-07-28 18:47:10,411] Trial 2 finished with value: -25.472000000000005 and parameters: {'optimizer': 'COBYLA', 'reps': 5, 'gamma_0': -1.614623459176333, 'gamma_1': 0.8591604092363081, 'gamma_2': 1.8151001973578635, 'gamma_3': -1.0780970181077683, 'gamma_4': 2.637405442834721, 'beta_0': -0.4090494888883187, 'beta_1': 2.8533932330364644, 'beta_2': 2.943131117692891, 'beta_3': 1.0730496140550612, 'beta_4': -2.624261550609288}. Best is trial 2 with value: -25.472000000000005. [I 2021-07-28 18:53:43,499] Trial 3 finished with value: -25.670999999999996 and parameters: {'optimizer': 'SPSA', 'reps': 3, 'gamma_0': 0.9107357072983584, 'gamma_1': 2.913210091517028, 'gamma_2': 0.5763204128607793, 'beta_0': 1.109791156932035, 'beta_1': 0.9627569292926577, 'beta_2': 2.4872274967867556}. Best is trial 3 with value: -25.670999999999996. [I 2021-07-28 18:54:22,416] Trial 4 finished with value: -27.409000000000002 and parameters: {'optimizer': 'COBYLA', 'reps': 4, 'gamma_0': -1.2057741714513615, 'gamma_1': -1.262942128591266, 'gamma_2': -2.928899709597318, 'gamma_3': 1.4226082632850536, 'beta_0': -1.8935977724963606, 'beta_1': 0.8385439294384947, 'beta_2': -1.983679280918586, 'beta_3': -0.29861447819561304}. Best is trial 4 with value: -27.409000000000002.
print(study.best_trial)
FrozenTrial(number=4, values=[-27.409000000000002], datetime_start=datetime.datetime(2021, 7, 28, 18, 53, 43, 503100), datetime_complete=datetime.datetime(2021, 7, 28, 18, 54, 22, 414575), params={'optimizer': 'COBYLA', 'reps': 4, 'gamma_0': -1.2057741714513615, 'gamma_1': -1.262942128591266, 'gamma_2': -2.928899709597318, 'gamma_3': 1.4226082632850536, 'beta_0': -1.8935977724963606, 'beta_1': 0.8385439294384947, 'beta_2': -1.983679280918586, 'beta_3': -0.29861447819561304}, distributions={'optimizer': CategoricalDistribution(choices=('SPSA', 'COBYLA')), 'reps': IntUniformDistribution(high=11, low=1, step=1), 'gamma_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'gamma_3': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_0': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_1': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_2': UniformDistribution(high=3.141592653589793, low=-3.141592653589793), 'beta_3': UniformDistribution(high=3.141592653589793, low=-3.141592653589793)}, user_attrs={'best': [-27.409000000000002, optimal function value: -35.0
optimal value: [0. 1. 0. 1. 0.]
status: SUCCESS, array([-0.20577417, -0.26294213, -2.92889971, 1.42260826, -1.89359777,
0.83854393, -1.98367928, -0.29861448])]}, system_attrs={}, intermediate_values={}, trial_id=4, state=TrialState.COMPLETE, value=None)
fig = optuna.visualization.plot_optimization_history(study)
fig.show()
mean, result, optimal_params = study.user_attrs["best"]
optimal_params
array([-0.20577417, -0.26294213, -2.92889971, 1.42260826, -1.89359777,
0.83854393, -1.98367928, -0.29861448])
max_cut.draw(result)
mean, distribution = max_cut.analyse(result, print_output=True)
plot_histogram(distribution, color='midnightblue', title=f"Expectation Value (Ø: {mean:.3f})")
optimal function value: -35.0 optimal value: [0. 1. 0. 1. 0.] status: SUCCESS Mean: -27.409000000000002 00000: value: 0.000, probability: 0.8% 11111: value: 0.000, probability: 1.0% 10010: value: -13.000, probability: 4.0% 01101: value: -13.000, probability: 4.6% 10000: value: -15.000, probability: 4.0% 01111: value: -15.000, probability: 4.4% 00100: value: -16.000, probability: 0.4% 00010: value: -16.000, probability: 0.9% 11101: value: -16.000, probability: 1.4% 11011: value: -16.000, probability: 0.2% 01100: value: -17.000, probability: 2.4% 10011: value: -17.000, probability: 1.6% 01000: value: -19.000, probability: 0.1% 10110: value: -29.000, probability: 5.6% 01001: value: -29.000, probability: 7.2% 11110: value: -30.000, probability: 1.6% 00001: value: -30.000, probability: 2.1% 10100: value: -31.000, probability: 3.2% 01011: value: -31.000, probability: 3.2% 11100: value: -32.000, probability: 2.0% 11010: value: -32.000, probability: 8.2% 00110: value: -32.000, probability: 2.2% 11001: value: -32.000, probability: 2.1% 00101: value: -32.000, probability: 6.9% 00011: value: -32.000, probability: 1.8% 01110: value: -33.000, probability: 0.8% 10001: value: -33.000, probability: 1.3% 11000: value: -34.000, probability: 6.7% 00111: value: -34.000, probability: 8.8% 01010: value: -35.000, probability: 5.6% 10101: value: -35.000, probability: 4.9%
import qiskit.tools.jupyter
%qiskit_version_table
| Qiskit Software | Version |
|---|---|
| Qiskit | 0.27.0 |
| Terra | 0.17.4 |
| Aer | 0.8.2 |
| Ignis | 0.6.0 |
| Aqua | 0.9.2 |
| IBM Q Provider | 0.14.0 |
| System information | |
| Python | 3.8.6 (default, Jan 22 2021, 11:41:28) [GCC 8.4.1 20200928 (Red Hat 8.4.1-1)] |
| OS | Linux |
| CPUs | 192 |
| Memory (Gb) | 6046.015735626221 |
| Wed Jul 28 18:54:23 2021 CEST | |